home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
fsw
/
mcdrv
/
mctech.doc
< prev
next >
Wrap
Text File
|
1996-05-01
|
13KB
|
493 lines
───────────────────────────────
MCDRV
Music Creative driver for X680x0
【外部からの操作の仕方や情報の取得方法等の解説】
───────────────────────────────
written by CUL. (1996-04-04)
このドキュメントでは以下の項目についての解説してあります。
・システム/トラックワーク参照
・ノートオン/オフ情報取得
・演奏同期
・メモリ管理テーブルの構造
・効果音等について
───────────────────────────────────────
システム/トラックワーク参照
───────────────────────────────────────
MCDRV では、トラックワークとシステムワークの一部の参照を禁止しています。これ
は、バージョン間の互換性を考えたもので、支援ソフトの開発を妨げるものではありま
せん。
システムワークは仕様が固まり次第順次公開していく予定です。
トラックワークを順次操作して行くプログラムなどは、サービスコール
$1f _GETTRWORKSIZE トラックワークサイズの取得
で1トラックワークの長さを求めて、処理をするようにして下さい。
これらの事項を守ったプログラムならば、MCDRV v0.40~v0.99 まで互換がとれるこ
とを保証します。
以下は公開されているワークの説明です。
(一部に間違いがあるかもしれないので注意して下さい)
■ ワーク全体の構造
ワークの構造は _GETWORKADR で求めたアドレスから正と負の両方へ延びるような形
になっています。
: :
│ SYSTEM WORK │ 負 ↑システムワーク
│ │
┝━━━━━━━┥±0 ← _GETWORKADR で返されるアドレス
│ TRACK #01 │
├───────┤ 正 ↓トラックワーク
│ TRACK #02 │
├───────┤
: :
以下は各ワークの説明です。切り取ってそのままインクルードする事ができます。
* ■ システムワーク
INF_MIDIINBUF: equ -$a0 *8.l MIDI IN バッファへのポインタ (解説は後述)
INF_PLAY: equ -$80 *.w ポーズフラグ 0:STOP 1:PAUSE 2:PLAY
INF_FADES: equ -$7e *.w フェードフラグ(sys) 0:NOMAL 1:F.IN 2:F.OUT
INF_FADEM: equ -$7c *.w フェードフラグ(曲) 0:NOMAL 1:F.IN 2:F.OUT
INF_KSFTS: equ -$7a *.w キーシフト(sys) (-127~127)
INF_KSFTM: equ -$78 *.w キーシフト(曲) 〃
INF_KSFT: equ -$76 *.w キーシフト(合計) 〃
INF_TRNUM: equ -$70 *.w トラック数 (32~128)
INF_TRUSE: equ -$6e *.w 使用トラック数 (0~128)
INF_LOOP: equ -$6c *.w ループカウンター
INF_TEMPOSNS: equ -$6a *.w テンポセンス (1~4096)
INF_DIVISION: equ -$68 *.w 4分音符の分解能
INF_TEMPO: equ -$66 *.w テンポ (1~4096)
INF_ENDCLOCK: equ -$64 *.l 演奏終了時のクロック
INF_NOWCLOCK: equ -$60 *.l 現在の経過クロック
INF_INTERVAL: equ -$5c *.l 割り込み間隔 (1/10^6秒単位)
INF_PASSC: equ -$58 *.l 1/10^6秒カウンタ (0~999999)
INF_PASSMIN: equ -$54 *.w 経過時間(分) (0~65535)
INF_PASSSEC: equ -$52 *.w 経過時間(秒) (0~59)
INF_TRACT: equ -$40 *8.l トラックアクト 0:SLEEP 1:ACTIVE
* トラックの動作状態です。ビットマップで格納されており、格納方式は
* TR0~31が最初の4バイト、TR32~63が次の4バイトという風に合計256
* トラック分まであります。
* movem.l (An),d0-d3 のように扱うのに都合よくなっています。
* ■ トラックワーク
ACTIVE: equ $00 *.b トラックアクティビティ -1=kill 0=active
* ここが0でなければ演奏処理をしません。
WAITSIGNAL: equ $01 *.b トラック間通信 -1=wait 0=normal
* 基本的には ACTIVE と同様です。
MUTEMARK: equ $02 *.b 7:MUTE 6:LOCK 5:NORM 4:SE 3~0:unuse
* ビットマップのフラグです。
* bit 7 1 = 実際にミュートしています
* 6 1 = ミュートの状態がロックされています
* 5 1 = 通常のミュートです
* 4 1 = SE機能からミュートされています
* 3~0 予約
CURCH: equ $03 *.b 物理ch. 0~7:OPM 10~1f:ADPCM 80~:MIDI
* 操作の対象となるデバイス番号です。
* $00~$07 OPM
* $10~$1f ADPCM
* $80~$8f MIDI #1
* $90~$9f MIDI #2
* : :
NOWPITCH: equ $04 *.w 現在のピッチ
* デチューン等の静的な値が合計されたピッチです。
* 内蔵音源は半音=64、MIDIはベンドレンジによる値です。
* ・MIDI BEND の変換式
* (内蔵音源でのピッチ) = (NOWPITCH)*(BENDRANGE)/128
* equ $06 *.b
* 未使用、必ず0。
NOWVOLUME: equ $07 *.b 現在のボリューム
* 現在の値の元となるボリューム値です。
EVENT: equ $08 *.w 各種イベント
* ビットマップによるイベント処理フラグです。1/0=ON/OFF です。
* bit 15 音程LFO
* 14 音量LFO
* 13 ポルタメント
* 12~0 未定義
PARAMCHGJOBADR: equ $0c *.l パラメータ変更処理アドレス
* 各種デバイス操作ルーチンの処理アドレスが入っています。
* 外部から参照しても意味がありません。
PARAMCHG: equ $10 *.w パラメータ変更要求フラグ
* 外部プログラムとの通信用フラグです。
* ここは受取専用で、読み出しても大抵0が返って来ます。
* bit 15 バンク&プログラム
* 14 パンポット
* 13 リバーブ
* 12 コーラス
* 11 ボリューム
* 10~0 未定義
* 使い方は、音色切り替えを例にしますので参考にしてください。
* (例) プログラム番号変更の手順
* 1) トラックワークの BANKMSB/PROGRAM 等の内容を書き換える
* 2) PARAMCHG の音色切り替えに対応したビット(15)をセットする
* -> 次の演奏処理のときにその値が実際にセットされる
WASPITCH: equ $12 *.w 過去のピッチ
* ピッチ合計です。音程LFOやポルタメント等の値が全て合計されています。
* 変換式等は NOWPITCH と同じです。
WASVOLUME: equ $14 *.w 過去のボリューム
* ボリューム合計です。
* 音量LFOやフェーダー等の値が全て合計されています。
NEXTTRLINK: equ $16 *.w 後方へのトラックリンク
* 参照禁止です。(公開しません)
* 将来変更される可能性があります。
MMLPTR: equ $1c *.l 次の命令のアドレス
* MDCデータへのポインタです。
BANKMSB: equ $20 *.b 音色バンク上位
* 音色のバンクの上位の値です。
PROGRAM: equ $21 *.b 音色番号
* 音色番号が入っています。
* OPM は 0~255 までの値をとることができます。
* 音色番号が 128 以上の場合、内部的に BANKMSB +1、
* PROGRAM -128 という処理をしています。
VOLMST: equ $22 *.b ボリューム設定値
* ボリュームの設定値です。
PANMST: equ $23 *.b 128段階パンポット
* 128段階のパンポット値です。
BEND: equ $24 *.w ベンド値
* ベンド命令の値です。
CREVERB: equ $26 *.b リバーブ値
CCHORUS: equ $27 *.b コーラス値
* コントロールチェンジ 91:リバーブ 93:コーラス の値です。
NOWBAR: equ $28 *.w 現在の小節番号
* 現在の小節番号です。
* データに情報がなければ加算されません。
NOWSTEP: equ $2a *.b 現在のステップ (何命令実行したか)
* 小節線から現在までに実行された命令数です。
MVOLMST: equ $2b *.b マスターボリューム値
* マスターボリューム値です。
* MIDI ではコントロールチェンジ 7:ボリューム の値です。
BANKLSB: equ $2c *.b 音色バンク下位
* 音色バンクの下位バイトです。
BENDRANGE: equ $2d *.b ベンドレンジ
* ベンドレンジです。
WASPARAMCHG: equ $3c *.l パラメータ変更フラグ(外部同期用)
* パラメータが変わったことを外部に知らせるワークです。
* 現在は動作していません。
───────────────────────────────────────
MIDI IN 情報取得
───────────────────────────────────────
※搭載予定機能です。実際には存在しません。(^^;
MCDRV では、INF_MIDIINBUF が指し示すアドレスに MIDI IN 端子から入って来た情
報を書き出す事ができます。
アドレスは MIDI OUT に割り振られているデバイスと同じ順序で並んでいます。通常
は必要ありませんが、MIDI BOARD と RS-MIDI から同時に情報を取ったりする事もでき
ます。
INF_MIDIINBUF のバッファは初期状態では内部ワークエリアに設定されていますが、
書換えて別のアドレスにする事もできます。その場合、ユーザーが新たにバッファを確
保し、諸設定を行わなければなりません。
・バッファは FIFO であり、構造は以下のようにします。
offset size 内容
+00 .w ライトポインタ (0で初期化しておく)
+02 .w リードポインタ (0で初期化しておく)
+06 .w 格納バッファサイズ (0で初期化しておく)
+04 .w バッファサイズ (1~)
+08 .b バッファ (1バイト以上)
・MIDI IN を有効にさせるため _MIDIINACT をコールする
詳しくは MCCALL.DOC をお読み下さい。
・バッファリードサンプル
* in d0.w 取得するデバイス番号 (0~7)
* out d0.l 正 : MIDI IN データ (0~255)
* 負 : エラー
GET_MIDIIN: movem.l d1/a0,-(sp)
cmpi.w #8,d0
bcc get_midiinerr
movea.l MCDRV_WORK,a0
lea -$a0(a0),a0
lsl.w #2,d0
movea.l (a0,d0.w),a0
move.w (a0),d1 * リードポインタをとる
cmp.w 2(a0),d1 * ライトポインタと同じなら
beq get_midiinerr * データなし
moveq.l #0,d0
move.b 8(a0,d1.w),d0 * データ取得
addq.w #1,d1 * ポインタを進める
cmp.w 4(a0),d1 * バッファサイズ以上なら
bcs get_midiin10
moveq.l #0,d1 * ポインタを先頭に
get_midiin10: move.w d1,(a0)
get_midiin90: movem.l (sp)+,d1/a0
rts
get_midiinerr: moveq.l #-1,d0
bra get_midiin90
MCDRV_WORK: ds.l 1 * MCDRV のワークアドレスをセットしておく
───────────────────────────────────────
ノートオン/オフ情報取得
───────────────────────────────────────
MCDRV からのノートオン情報は、ノートオン等を出力する専用のバッファがあります
ので、これを利用します。バッファアドレス取得には _GETKEYONPTR を使用します。
■ ノートオンバッファの構造
MCNONPTR: ds.w 1 * FIFO の最新ポインタ
MCNONBUF: ds.b 4*256 * ノートオン情報
■ MCNONBUFの構造
_N_TRACK: ds.b 1 *+00 トラック
どのトラックからの情報かを表わします。
_N_NOTE: ds.b 1 *+01 ノート番号
どの音階がノートオンされたかを表わします。
_N_VELO: ds.b 1 *+02 ベロシティ
ベロシティが0だった場合、ノートオフしたことを表わします。
_N_CH: ds.b 1 *+03 チャンネル
v0.60 より有効です。どのチャンネルでノートオンされたかを表わします。
■ 実際の情報取得
各プログラムで過去の MCNONPTR を持っておいて下さい。
ここではそれを仮に MYNONPTR とします。
getnoteon:
move.w MCNONPTR(a5),d0 * a5=MCDRVのワークのアドレス
cmp.w MYNONPTR,d0 * ポインタが進んでないか
beq getnoteonend
addq.w #4,d0 * 進んでいた時の処理
andi.w #$3ff,d0
move.w d0,MYNONPTR * 自分のポインタを進める
lea MCNONBUF(a5),a0
adda.w d0,a0
move.b (a0)+,d1 * トラック
move.b (a0)+,d2 * ノート
move.b (a0)+,d3 * ベロシティ
: * 必要に応じた処理
bra getnoteon * 繰り返す
getnoteonend: * 終了
こんな感じで行なって下さい。
(無駄は各プログラムでいいように調整して下さい)
───────────────────────────────────────
演奏同期
───────────────────────────────────────
演奏開始からの経過クロックがシステムワークの INF_NOWCLOCK に格納されています。
同期にはこの数値を見て特定の値を超えたら処理をする様な事を行なって下さい。
■ 実際の演奏同期例
loop: MCDRV _GETNOWCLOCK
cmpi.l #同期させたいクロック,d0
bcs loop
───────────────────────────────────────
メモリ管理テーブルの構造
───────────────────────────────────────
MCDRV のメモリ管理ポインタの構造です。
ofst 説明
+00 一つ前のメモリ管理ポインタのアドレスが入っています。
+04 次の 〃
+08 このメモリブロックのサイズが入っています。
メモリ管理ポインタのサイズ 16 byte は含まれていません。
+0c 00 削除/リムーブ等が可能です。
01 このメモリブロックは MCDRV によってロックされています。
80 〃 外部からロックされています。
+0d 00 空です。
01 MDCデータが入っています。
02 ADPCMデータが入っています。
80 外部から確保された作業用ブロックです。
+0e 拡張用です
+0d
+10 データはここから入っています。
ユーザーが直接この値を見ることはほとんど無いと思います。
───────────────────────────────────────
効果音等について
───────────────────────────────────────
MCDRV は元々ゲーム組み込み用に作られたドライバーなので、効果音機能の扱い方も
比較的簡単に作られています。
■ MDC データによる効果音
・効果音制御の仕組
効果音トラックはドライバ内の未使用トラックの内、後方から使用されていきます。
ですから、起動時の -t オプションで確保したトラック本数以上の効果音の演奏はでき
ません。
上の様に処理されるため、トラック同期コマンド (MXDRV の W,S に相当) は使用で
きません。
また、OPM のハード LFO やホワイトノイズなどはドライバ側では一切管理していま
せん。従って、実用上メインか効果音の演奏のどちらか一方でしか使用する事ができま
せん。大抵の場合、効果音側でしか使用しないと思いますので、メイン演奏側ではこれ
らは使用しないようにします。
効果音演奏中にさらに重ねて効果音を演奏させる事ができます。通常は効果音は後発
優先で、最優先で演奏させたい場合は _PLAYSE2 を使用するようします。この場合、あ
る程度のレベルの割付をしてやる必要があります。
内蔵 FM 音源の音色管理はドライバ内部で独立して行うので、他の曲に同じ番号で違
う音色が登録してあっても正常な演奏ができます。
テンポの管理は効果音全体で1つしかありません。効果音を多重に呼び出す場合には、
効果音のテンポをなるべく一定にして作るよう心掛けて下さい。
・実際の操作等
ごく普通に演奏データを作ります。あとはメモリ上に固定しておき、_SEPLAY を実行
すればいつでも効果音として慣らす事ができます。
FADELVL を0にすると全トラックがマスクされた様な状態になります。これを利用す
ればメイン演奏とサブ演奏をスムーズに切り替えるといった芸当が可能です。